package org.fox.beetl.ext.spring;

import javax.annotation.PostConstruct;

import org.beetl.core.GroupTemplate;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.web.servlet.view.AbstractTemplateViewResolver;
import org.springframework.web.servlet.view.AbstractUrlBasedView;

/**
 * Beetl ViewResolver视图解析器
 * 
 * @author Chen Rui
 */
public class BeetlViewResolver extends AbstractTemplateViewResolver {
	/* ----- ----- ----- ----- 属性 ----- ----- ----- ----- */
	/**
	 * 视图使用的Beetl GroupTemplate，如果不设置，取上下文中唯一的GroupTemplate对象
	 */
	private GroupTemplate groupTemplate = null;

	/**
	 * 视图使用的Beetl GroupTemplate，如果不设置，取上下文中唯一的GroupTemplate对象
	 * 
	 * @param groupTemplate
	 *            视图使用的Beetl
	 *            GroupTemplate，由ViewResolver注入，如果不设置，取上下文中唯一的GroupTemplate对象
	 */
	public void setGroupTemplate(GroupTemplate groupTemplate) {
		this.groupTemplate = groupTemplate;
	}

	/* ----- ----- ----- ----- 构造函数 ----- ----- ----- ----- */
	/**
	 * 缺省构造函数
	 */
	public BeetlViewResolver() {
		setViewClass(BeetlView.class);
	}

	/**
	 * 在属性注入完毕后，初始化检查GroupTemplate，有@PostConstruct注解，如果有访问
	 * 
	 * @throws NoSuchBeanDefinitionException
	 *             如果未设置GroupTemplate，且Spring上下文中也没有唯一的GroupTemplate bean
	 * @throws NoUniqueBeanDefinitionException
	 *             如果未设置GroupTemplate，且Spring上下文中有多个GroupTemplate bean
	 */
	@PostConstruct
	public void init() throws NoSuchBeanDefinitionException, NoUniqueBeanDefinitionException {
		// 如果未指定groupTemplate，取上下文中唯一的GroupTemplate对象
		if (groupTemplate != null) {
			groupTemplate = getApplicationContext().getBean(GroupTemplate.class);
		}
	}

	/* ----- ----- ----- ----- 其他方法 ----- ----- ----- ----- */
	/**
	 * 视图类
	 * 
	 * @return
	 */
	@Override
	protected Class<?> requiredViewClass() {
		return BeetlView.class;
	}

	/**
	 * 实例化GroupTemplate
	 * 
	 * @param viewName
	 * @return
	 * @throws Exception
	 */
	@Override
	protected AbstractUrlBasedView buildView(String viewName) throws Exception {
		BeetlView beetlView = (BeetlView) super.buildView(viewName);
		// 为视图对象注入GroupTemplate
		beetlView.setGroupTemplate(groupTemplate);
		return beetlView;
	}
}